﻿#ifndef PLAYBACKCONTROLWIDGE_H
#define PLAYBACKCONTROLWIDGE_H

#include <QWidget>
#include "PlayBackControl.h"

namespace Ui {
class GY_PlayBackControlWidget;
}
#define MAX_PLAY_FORWARD_SPEED 8.0f
#define MAX_PLAY_BACKWARD_SPEED -8.0f
class GY_CONTROLLIBRARY_EXPORT GY_PlayBackControlWidget : public QWidget
{
    Q_OBJECT
public:
    /**
     * @brief The PlayBackState enum
     * 数据回放状态
     */
    enum PlayBackState
    {
        //!回放中
        PlayBacking,
        //!已暂停
        PlayBackPause,
         //!已停止
        PlayBackStop
    };
public:
    explicit GY_PlayBackControlWidget(QWidget *parent = nullptr);
    ~GY_PlayBackControlWidget();
    /**
     * @brief setStartEndDateTime 设置开始、结束的日期和时间
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param startDate 开始日期：默认2000-1-1
     * @param endDate 结束日期：默认2000-1-1
     */
    void setStartEndDateTime(const quint64 &startTime, const quint64 &endTime, const QDate &startDate = QDate(2000,1,1), const QDate &endDate = QDate(2000,1,1));
public slots:
    /**
     * @brief addPlayBackData 添加回放数据
     * @param date 日期
     * @param time 时间：us
     * @param msgId 消息id
     * @param data 数据
     */
    void addPlayBackData(const QDate& date, const quint64 &time, const QVariant &msgId, const QVariant &data);
private:
    Ui::GY_PlayBackControlWidget *ui;
    //!回放控制对象
    PlayBackControl m_PlayBackControl;
    //!播放速度
    float m_PlaySpeed;
    //!回放状态
    PlayBackState m_PlayBackState;
    //!更新计时器
    QTimer m_CurrentTimeUpdataTimer;
    //!查找事件标志
    bool m_FindTimeFlag;
signals:
    /**
     * @brief sendPlayBackDataSignal 发送回放数据信号
     * @param msgId 消息id
     * @param data 数据
     */
    void sendPlayBackDataSignal(const QDate& date, const quint64& time, const QDate& dataDate = QDate(2000,1,1), const quint64& dataTime = 0, const QVariant &msgId = QVariant(), const QVariant& data = QVariant());
    /**
     * @brief goToTime 跳转时间信号
     * @param date 跳转的日期
     * @param time 跳转的时间
     */
    bool goToTime(const QDate& date, const quint64& time);
    /**
     * @brief startPlayBackSignal 开始回放信号
     * @return  返回是否执行后续操作
     */
    bool startPlayBackSignal();
    /**
     * @brief stopPlayBackSignal 停止回放信号
     * @return 返回是否执行后续操作
     */
    bool stopPlayBackSignal();
    /**
     * @brief pausePlayBackSignal 暂停播放信号
     * @return  返回是否执行后续操作
     */
    bool pausePlayBackSignal();
private:
    /**
     * @brief setPlayBackState 根据播放状态和速度设置播放状态显示
     */
    void setPlayBackState();
private slots:
    //暂停
    void on_pushButton_Pause_clicked();
    //停止
    void on_pushButton_Stop_clicked();
    //播放
    void on_pushButton_Play_clicked();
    //快进
    void on_pushButton_FastForward_clicked();
    //快退
    void on_pushButton_FastBackward_clicked();
    //当前时间更新
    void currentTimeUpdate();
    //时间跳转
    void on_pushButton_GoTime_clicked();
    /**
     * @brief on_horizontalSlider_Time_sliderReleased  时间滑块抬起
     */
    void on_horizontalSlider_Time_sliderReleased();
    void on_horizontalSlider_Time_sliderPressed();
};

#endif // PLAYBACKCONTROLWIDGE_H
